home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Source / Tools / XYplane.Mod (.txt) < prev   
Oberon Text  |  1995-08-22  |  3KB  |  86 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10b.Scn.Fnt
  3. MODULE XYplane;  (* Graphic output to screen, Input from keyboard, page 91, 100, 311 *)
  4. IMPORT Display, MenuViewers, Oberon, TextFrames, Input;
  5. CONST 
  6.     max = 32768;  closed = 0;  displayed = 2;
  7.     black = Display.black;  white = Display.white;  replace = Display.replace;
  8.     erase* = 0;  draw* = 1; (* values for parameter mode in Dot *)
  9. TYPE 
  10.     XYframe = POINTER TO XYframeDesc;
  11.     XYframeDesc = RECORD (Display.FrameDesc) END;
  12.     F: XYframe;  V: MenuViewers.Viewer;
  13.     X*, Y*, W*, H*: INTEGER;
  14.     bitmap: ARRAY max OF SET;
  15. PROCEDURE Modify(F: XYframe; VAR M: MenuViewers.ModifyMsg);
  16. BEGIN
  17.     IF (M.id = MenuViewers.extend) & (M.dY > 0) THEN
  18.         Display.ReplConst(black, F.X, F.Y + F.H, F.W, M.dY, replace)
  19.     END;
  20.     IF M.Y < F.Y THEN
  21.         Display.ReplConst(black, F.X, M.Y, F.W, F.Y - M.Y, replace)
  22.     END;
  23.     X := F.X;  Y := M.Y;  W := F.W;  H := M.H
  24. END Modify;
  25. PROCEDURE XYhandle*(F: Display.Frame; VAR M: Display.FrameMsg);
  26. BEGIN
  27.     WITH F: XYframe DO
  28.         IF M IS Oberon.InputMsg THEN
  29.             WITH M: Oberon.InputMsg DO
  30.                 IF M.id = Oberon.track THEN
  31.                     Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y)
  32.                 END
  33.             END
  34.         ELSIF M IS MenuViewers.ModifyMsg THEN
  35.             WITH M: MenuViewers.ModifyMsg DO
  36.                 Modify(F, M)
  37.             END
  38.         END
  39.     END 
  40. END XYhandle;
  41. PROCEDURE Clear*;
  42. VAR j: LONGINT;
  43. BEGIN
  44.     Display.ReplConst(black, F.X, F.Y, F.X + F.W, F.Y + F.H, replace);
  45.     j := 0;  WHILE j < max DO  bitmap[j] := {}; INC(j) END
  46. END Clear;
  47. PROCEDURE Open*;
  48. VAR menuF: TextFrames.Frame;  x, y: INTEGER;  
  49. BEGIN
  50.     IF V.state # displayed THEN
  51.         Oberon.OpenTrack(Display.Left, 0);
  52.         menuF := TextFrames.NewMenu("XY plane", "System.Close");
  53.         NEW(F);  F.handle := XYhandle;
  54.         Oberon.AllocateUserViewer(Display.Left, x, y);
  55.         V := MenuViewers.New(menuF, F, TextFrames.menuH, x, y)
  56.     END;
  57.     Clear
  58. END Open;
  59. PROCEDURE Dot*(x, y, mode: INTEGER);
  60. VAR k, i, j: LONGINT;
  61. BEGIN 
  62.     IF (x >= F.X) & (x < F.X + F.W) & (y >= F.Y) & (y < F.Y + F.H) THEN
  63.         k := LONG(y)*F.W + x;  i := k DIV MAX(SET);  j := k MOD MAX(SET);
  64.         CASE mode OF
  65.               0: Display.Dot(black, x, y, replace); EXCL(bitmap[i], j)
  66.             |1: Display.Dot(white, x, y, replace); INCL(bitmap[i], j)
  67.         END
  68. END Dot;
  69. PROCEDURE IsDot*(x, y: INTEGER): BOOLEAN;
  70. VAR k, i, j: LONGINT;
  71. BEGIN
  72.     IF (x >= F.X) & (x < F.X + F.W) & (y >= F.Y) & (y < F.Y + F.H) THEN
  73.         k := LONG(y)*F.W + x;  i := k DIV MAX(SET);  j := k MOD MAX(SET);  
  74.         IF j IN bitmap[i] THEN RETURN TRUE  ELSE RETURN FALSE END
  75.     ELSE RETURN FALSE
  76. END IsDot;
  77. PROCEDURE Key*(): CHAR;
  78. VAR ch: CHAR;
  79. BEGIN  ch := 0X;
  80.     IF Input.Available() > 0 THEN  Input.Read(ch)  END;
  81.     RETURN ch
  82. END Key;
  83. BEGIN  
  84.     NEW(F);  F.H := 0;  NEW(V);  V.state := closed; 
  85. END XYplane.    (* Copyright M. Reiser, 1992 *)
  86.